class _WebSocket {
  // 是否打开连接
  isOpen = false;
  // 全局的定时器
  globalTimer = null;
  // 存储task对象
  socketTask = null;
  // 连接socket
  async connectSocket(
        // data = {},
        // linkMark, //连接标识
        option = {}, // 连接需要带的额外的参数
        successFunc = null, // 连接成功回调
        errorFunc = null, // 连接错误回调
        receiveFunc = null, // 接收到消息回调
        closeFunc = null, // 连接关闭回调
  ) {
    try {
      // 如果连接已存在并且已经打开就不再连接
      if (this.socketTask && this.isOpen) {
        return;
      }
      // 获取头  await getAccessApiHeaders()
      const header = {};
      // 构建参数
      // let params = {
      //     access_token: header['Access-Token'],
      //     access_t_id: header['Access-T-Id'],
      //     access_t_id_in: header['Access-T-Id-In'],
      //     ...option
      // }
      // 获取对应的长连接URL await system.getWebsocketUrl(linkMark, params)
      // wss://dev.fushengkang.cn
      // ws://192.168.1.103:8999
      // let baseUrl = "wss://dev.fushengkang.cn"
      const baseUrl = 'wss://api.igooda.com/websocket';
      const url = `${baseUrl}?Authorization=${option.token}`;
      // 建立连接
      this.socketTask = uni.connectSocket({
        url,
        header,
        success() {
          console.log('websocket:连接成功！');
        },
      });
      // 监听打开事件
      this.socketTask.onOpen((res) => {
        console.log('websocket:打开成功！');
        this.isOpen = true;
        // 开启心跳检测
        this.heartBeatTest();
        // 回调
        if (successFunc) {
          successFunc(res);
        }
      });
      // 监听连接关闭事件
      this.socketTask.onClose(() => {
        console.log('websocket:已关闭！');
        this.isOpen = false;
        if (closeFunc) {
          closeFunc();
        }
      });
      // 监听websocket错误事件
      this.socketTask.onError((res) => {
        console.log('websocket:已出错！');
        this.isOpen = false;
        if (errorFunc) {
          errorFunc(res);
        }
      });
      // 监听接收到的消息
      this.socketTask.onMessage((res) => {
        if (receiveFunc) {
          receiveFunc(res);
        }
      });
    }
    catch (error) {
      console.log(`websocket:异常:${error}`);
    }
  }

  // 发送消息(msg是一个对象)
  sendMessage(msg = null, successFunc = null, errorFunc = null) {
    if (!this.socketTask || !this.isOpen || !msg) {
      if (errorFunc) {
        errorFunc('未传消息内容或连接未打开！');
      }
      return;
    }
    this.socketTask.send({
      data: JSON.stringify(msg),
      success(res) {
        if (successFunc) {
          successFunc(res);
        }
      },
      fail(err) {
        if (errorFunc) {
          errorFunc(err);
        }
      },
    });
  }

  // 关闭连接
  closeSocket() {
    if (!this.socketTask || !this.isOpen) {
      return;
    }
    // 关闭socket连接
    this.socketTask.close();
    // 设置关闭状态
    this.isOpen = false;
  }

  // 心跳检测
  heartBeatTest() {
    // 清除定时器
    clearInterval(this.globalTimer);
    // 开启定时器定时检测心跳
    this.globalTimer = setInterval(() => {
      this.sendMessage({
        code: '0',
        // msg: '维持心跳'
      }, null, () => {
        // 如果失败则清除定时器
        clearInterval(this.globalTimer);
      });
    }, 10000);
  }
}
export default _WebSocket;
